package com.atguigu.tingshu.album.service.impl;

import com.atguigu.tingshu.album.mapper.AlbumAttributeValueMapper;
import com.atguigu.tingshu.album.mapper.AlbumInfoMapper;
import com.atguigu.tingshu.album.mapper.AlbumStatMapper;
import com.atguigu.tingshu.album.mapper.TrackInfoMapper;
import com.atguigu.tingshu.album.service.AlbumAttributeValueService;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.common.execption.GuiguException;
import com.atguigu.tingshu.common.rabbit.constant.MqConst;
import com.atguigu.tingshu.common.rabbit.service.RabbitService;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.album.AlbumStat;
import com.atguigu.tingshu.model.album.TrackInfo;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.atguigu.tingshu.vo.album.AlbumStatVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Slf4j
@Service
@SuppressWarnings({"all"})
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {

	@Autowired
	private AlbumInfoMapper albumInfoMapper;
	@Autowired
	private AlbumAttributeValueMapper albumAttributeValueMapper;
	@Autowired
	private AlbumStatMapper  albumStatMapper;
	@Autowired
	private AlbumAttributeValueService albumAttributeValueService;
	@Autowired
	private TrackInfoMapper trackInfoMapper;
	@Autowired
	private RabbitService rabbitService;


	// 根据专辑id获取专辑统计信息
	@Override
	public AlbumStatVo getAlbumStatVoByAlbumId(Long albumId) {
		return albumStatMapper.getAlbumStatVoByAlbumId(albumId);
	}



	@Override
	@Transactional
	public void saveAlbumInfo(AlbumInfoVo albumInfoVo) {
		//1.添加专辑基本信息
		AlbumInfo albumInfo = new AlbumInfo();
		//AlbumInfoVo 值拷贝到 AlbumInfo
		BeanUtils.copyProperties(albumInfoVo, albumInfo);
		//专辑有几个值需要单独设置，前端没有传递过来的

		albumInfo.setUserId(1L);
		//专辑状态，设置通过
		albumInfo.setStatus(SystemConstant.ALBUM_STATUS_PASS);
		//设置收费专辑，免费试听集数，前五集
		String payType = albumInfo.getPayType();
		if (!SystemConstant.ALBUM_PAY_TYPE_FREE.equals(payType)){
			albumInfo.setTracksForFree(5);
		}
		//调用方法保存
		albumInfoMapper.insert(albumInfo);


		//2.添加专辑下面标签名称和标签值数据 album_attribute_value
		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		//非空判断
		/*if (!CollectionUtils.isEmpty(albumAttributeValueVoList)){
			albumAttributeValueVoList.stream().forEach(albumAttributeValueVo -> {
				AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
				BeanUtils.copyProperties(albumAttributeValueVo, albumAttributeValue);
				//设置专辑id
				albumAttributeValue.setAlbumId(albumInfo.getId());

				albumAttributeValueMapper.insert(albumAttributeValue);
			});
		}*/
	    	List<AlbumAttributeValue> albumAttributeValueList =
					albumAttributeValueVoList.stream().map(albumAttributeValueVo -> {
						AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
						BeanUtils.copyProperties(albumAttributeValueVo, albumAttributeValue);
						albumAttributeValue.setAlbumId(albumInfo.getId());
						return albumAttributeValue;
		}).collect(Collectors.toList());
		albumAttributeValueService.saveBatch(albumAttributeValueList);
		//3.添加四个专辑统计数据 播放量，订阅量等，初始值为0 album_stat
		//播放量
		this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_PLAY);
		//订阅量
		this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_SUBSCRIBE);
		//下载量
		this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_BROWSE);
		//评论数
		this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_COMMENT);

		// 判断专辑是否公开的，如果公开的，发送mq消息，实现专辑的上架
		String isOpen = albumInfo.getIsOpen();
		// 发送上架消息
		if ("1".equals(isOpen)){
			rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM,
					MqConst.ROUTING_ALBUM_UPPER,
					albumInfo.getId());
		}
	}
	//保存专辑统计数据的方法
	public void saveAlbumStat(Long albumId, String statType){
		AlbumStat albumStat = new AlbumStat();
		albumStat.setAlbumId(albumId);
		albumStat.setStatType(statType);
		albumStat.setStatNum(0);
		albumStatMapper.insert(albumStat);
	}

	//查询专辑列表
	@Override
	public IPage<AlbumListVo> selectAlbumPage(Page<AlbumListVo> pageParam, AlbumInfoQuery albumInfoQuery) {
		return albumInfoMapper.selectUserAlbumPage(pageParam,albumInfoQuery);
	}

	@Override
	public void removeAlbumInfo(String albumId) {

		//判断专辑下是否有声音
		LambdaQueryWrapper<TrackInfo> queryWrapper = new LambdaQueryWrapper<>();
		queryWrapper.eq(TrackInfo::getAlbumId,albumId);
		Long count = trackInfoMapper.selectCount(queryWrapper);
		if (count > 0){
			throw new GuiguException(400,"该专辑下有声音，请先删除声音");
		}
		//删除专辑基本数据
		albumInfoMapper.deleteById(albumId);

		//删除专辑标签数据
		LambdaQueryWrapper<AlbumAttributeValue> queryWrapper1 = new LambdaQueryWrapper<>();
		queryWrapper1.eq(AlbumAttributeValue::getAlbumId,albumId);
		albumAttributeValueMapper.delete(queryWrapper1);

		//删除专辑统计数据
		LambdaQueryWrapper<AlbumStat> queryWrapper2 = new LambdaQueryWrapper<>();
		queryWrapper2.eq(AlbumStat::getAlbumId,albumId);
		albumStatMapper.delete(queryWrapper2);

		// 发送mq下架消息
		rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM,
				MqConst.ROUTING_ALBUM_LOWER, albumId);

	}

	@Override
	public AlbumInfo getAlbumInfo(Long albumId) {
		//1 根据专辑id获取专辑基本信息
		AlbumInfo albumInfo = albumInfoMapper.selectById(albumId);
		if (albumInfo == null){
			return null;
		}

		//2 根据专辑id获取标签数据
		LambdaQueryWrapper<AlbumAttributeValue> wrapper = new LambdaQueryWrapper<>();
		wrapper.eq(AlbumAttributeValue::getAlbumId,albumId);
		List<AlbumAttributeValue> albumAttributeValueList = albumAttributeValueMapper.selectList(wrapper);

		//3 把获取标签数据list集合封装到专辑对象里面
		albumInfo.setAlbumAttributeValueVoList(albumAttributeValueList);

		return albumInfo;
	}

	@Override
	public void updateAlbumInfo(Long albumId, AlbumInfoVo albumInfoVo) {
		//根据专辑id修改专辑基本信息
		AlbumInfo albumInfo = albumInfoMapper.selectById(albumId);
		BeanUtils.copyProperties(albumInfoVo,albumInfo);
		albumInfoMapper.updateById(albumInfo);

		//根据专辑id修改专辑标签数据
		LambdaQueryWrapper<AlbumAttributeValue> wrapper = new LambdaQueryWrapper<>();
		wrapper.eq(AlbumAttributeValue::getAlbumId,albumId);
		albumAttributeValueMapper.delete(wrapper);

		//添加专辑下面 标签名称和标签值数据 album_attribute_value
		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		if (!CollectionUtils.isEmpty(albumAttributeValueVoList)){
			albumAttributeValueVoList.stream().forEach(albumAttributeValueVo -> {
							AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
							BeanUtils.copyProperties(albumAttributeValueVo, albumAttributeValue);
							albumAttributeValue.setAlbumId(albumId);
							albumAttributeValueMapper.insert(albumAttributeValue);
			});
		}

	}

	@Override
	public List<AlbumInfo> findUserAllAlbumList(Long userId) {
		//创建page对象，传入当前页码，每页记录数
		Page<AlbumInfo> pageParam = new Page<>(1,100);
		LambdaQueryWrapper<AlbumInfo> wrapper = new LambdaQueryWrapper<>();
		wrapper.select(AlbumInfo::getId, AlbumInfo::getAlbumTitle);
		wrapper.eq(AlbumInfo::getUserId,userId);
		wrapper.orderByDesc(AlbumInfo::getId);
		Page<AlbumInfo> albumInfoPage = albumInfoMapper.selectPage(pageParam, wrapper);
		List<AlbumInfo> list = albumInfoPage.getRecords();
		return list;
	}

	@Override
	public Map<String, Object> getAlbumInfoStat(Long albumId) {
		return albumStatMapper.getAlbumInfoStat(albumId);
	}


}

